% =========================================================================
% InitParameters_new.m - (V3-精确模型版) 初始化所有系统参数和NMPC控制器
%
% 核心修改:
% 1. 引入了基于PDF文档的更精确的燃料电池电化学模型参数。
% 2. 参数包括电堆数量、有效面积、气体常数、法拉第常数以及极化损失相关的系数。
% =========================================================================

%% 1. 仿真与控制器参数
SimParams.Ts = 0.1;       
SimParams.T_sim = 50;     

%% 2. 电池模型参数 (BattParams)
BattParams.Capacity_As = 360; % 电池总容量 (单位: 安秒 A*s, 假设1Ah)
BattParams.OCV_SOC_map = [
    0.1,  0.2,  0.3,  0.4,  0.5,  0.6,  0.7,  0.8,  0.9,  1.0;
    41.0, 41.8, 42.5, 43.2, 44.4, 45.6, 46.8, 48.0, 49.2, 50.4
];

%% 3. 燃料电池模型参数 (FCParams) - 【根据PDF文档全面更新】
% --- 3.1 基础物理参数 ---
FCParams.N_cells = 80;          % 燃料电池电堆中的单电池数量
FCParams.T = 333;               % 电池运行温度 (K), 对应PDF中的 60°C
FCParams.R_const = 8.3145;      % 气体常数 (J/mol·K)
FCParams.F_const = 96485;       % 法拉第常数 (C/mol)

% --- 3.2 气体压力 (假设为恒定值) ---
FCParams.p_h2 = 1.0;            % 氢气分压 (atm) - 可根据系统调整
FCParams.p_o2 = 0.21;           % 氧气分压 (atm) - 假设使用空气，氧气占21%

% --- 3.3 电化学模型参数 (参考PDF中的典型值) ---
FCParams.A = 200;               % 单电池有效电极面积 (cm^2)
FCParams.i_0 = 4e-5;            % 交换电流密度 (A/cm^2)
FCParams.i_L = 1.4;             % 极限电流密度 (A/cm^2)
FCParams.i_internal = 0.003;    % 内部电流及燃料渗透损失等效电流密度 (A/cm^2)
FCParams.alpha = 0.5;           % 电荷转移系数 (无量纲)
FCParams.R_ohmic_area = 0.2;    % 单电池的面积欧姆电阻 (Ohm·cm^2)

% --- 3.4 动态响应参数 (保持不变) ---
FCParams.tau_fc = 0.5;          % 功率响应时间常数 (s)
FCParams.P_fc_max = 5000;       % 电堆最大功率 (W)
FCParams.P_fc_min = 100;        % 电堆最小工作功率 (W)

%% 4. 成本函数参数 (CostParams)
CostParams.p_H2 = 0.2;        
CostParams.k_H2 = 8e-5;       
CostParams.C_bat_total = 500; 
CostParams.N_cycle = 800;     
CostParams.C_fc_total = 2000; 
CostParams.alpha_max = 0.2;   
CostParams.k_d = 1e-9;        

%% 5. 创建并配置非线性MPC控制器 (nlmpc)
nx = 3; 
ny = 3; 
nu = 1; 

nlobj = nlmpc(nx, ny, nu);
nlobj.Model.StateFcn = 'prediction_model_new';
nlobj.Model.NumberOfParameters = 1; 
nlobj.Ts = SimParams.Ts;
nlobj.PredictionHorizon = 15; 
nlobj.ControlHorizon = 1;     
nlobj.Optimization.CustomCostFcn = 'cost_function_new'; 
nlobj.Optimization.ReplaceStandardCost = true;
nlobj.Model.IsContinuousTime=false;
nlobj.States(1).Min = 0.2;  nlobj.States(1).Max = 0.8;
nlobj.States(2).Min = FCParams.P_fc_min; nlobj.States(2).Max = FCParams.P_fc_max;
nlobj.States(3).Min = 0;    nlobj.States(3).Max = CostParams.alpha_max;
nlobj.OutputVariables(1).Min = 0.2;  nlobj.OutputVariables(1).Max = 0.8;
nlobj.OutputVariables(2).Min = FCParams.P_fc_min; nlobj.OutputVariables(2).Max = FCParams.P_fc_max;
nlobj.OutputVariables(3).Min = 0;    nlobj.OutputVariables(3).Max = CostParams.alpha_max;
nlobj.ManipulatedVariables(1).Min = 0;
nlobj.ManipulatedVariables(1).Max = (FCParams.i_L - 0.01) * FCParams.A; % 留一些余量避免数值问题
nlobj.States(2).ScaleFactor=50;
nlobj.OutputVariables(2).ScaleFactor=50;
nlobj.ManipulatedVariables(1).Name = 'I_fc_cmd';
disp('【精确模型版】初始化完成。');
